home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / assembler / progasm1.lha / SORGENTI / LEZIONE3f.s < prev    next >
Text File  |  1994-10-30  |  7KB  |  211 lines

  1.  
  2. ; Lezione3f.s              BARRETTA SOTTO LA LINEA $FF
  3.  
  4. ;    Questo listato e' identico al Lezione3d.s, fatta eccezione per
  5. ;    il fatto che la barretta si trova sotto la linea $FF che non
  6. ;    abbiamo mai oltrepassato.
  7.  
  8.     SECTION    CiriCop,CODE
  9.  
  10. Inizio:
  11.     move.l    4.w,a6        ; Execbase in a6
  12.     jsr    -$78(a6)    ; Disable - ferma il multitasking
  13.     lea    GfxName(PC),a1    ; Indirizzo del nome della lib da aprire in a1
  14.     jsr    -$198(a6)    ; OpenLibrary, routine della EXEC che apre
  15.                 ; le librerie, e da in uscita l'indirizzo
  16.                 ; di base di quella libreria da cui fare le
  17.                 ; distanze di indirizzamento (Offset)
  18.     move.l    d0,GfxBase    ; salvo l'indirizzo base GFX in GfxBase
  19.     move.l    d0,a6
  20.     move.l    $26(a6),OldCop    ; salviamo l'indirizzo della copperlist
  21.                 ; di sistema
  22.     move.l    #COPPERLIST,$dff080    ; Puntiamo la nostra COP
  23.     move.w    d0,$dff088        ; Facciamo partire la COP
  24. mouse:
  25.     cmpi.b    #$ff,$dff006    ; Siamo alla linea 255?
  26.     bne.s    mouse        ; Se non ancora, non andare avanti
  27.  
  28.     bsr.s    MuoviCopper    ; Routine che sfrutta il mascheramento del WAIT
  29.  
  30. Aspetta:
  31.     cmpi.b    #$ff,$dff006    ; Siamo alla linea 255?
  32.     beq.s    Aspetta        ; Se si, non andare avanti, aspetta la linea
  33.                 ; seguente, altrimenti MuoviCopper viene
  34.                 ; rieseguito
  35.  
  36.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  37.     bne.s    mouse        ; se no, torna a mouse:
  38.  
  39.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  40.     move.w    d0,$dff088        ; facciamo partire la cop
  41.  
  42.     move.l    4.w,a6
  43.     jsr    -$7e(a6)    ; Enable - riabilita il Multitasking
  44.     move.l    gfxbase(PC),a1    ; Base della libreria da chiudere
  45.                 ; (vanno aperte e chiuse le librerie!!!)
  46.     jsr    -$19e(a6)    ; Closelibrary - chiudo la graphics lib
  47.     rts
  48.  
  49. ; La routine MuoviCopper e' la stessa, sono cambiati solo i valori della
  50. ; massima altezza raggiungibile, ossia $0a e del fondo dello schermo, $2c.
  51.  
  52. MuoviCopper:
  53.     LEA    BARRA,a0
  54.     TST.B    SuGiu        ; Dobbiamo salire o scendere? se SuGiu e'
  55.                 ; azzerata, (cioe' il TST verifica il BEQ)
  56.                 ; allora saltiamo a VAIGIU, se invece e' a $FF
  57.                 ; (se cioe' questo TST non e' verificato)
  58.                 ; continuiamo salendo (facendo dei subq)
  59.     beq.w    VAIGIU
  60.     cmpi.b    #$0a,(a0)    ; siamo arrivati alla linea $0a+$ff? (265)
  61.     beq.s    MettiGiu    ; se si, siamo in cima e dobbiamo scendere
  62.     subq.b    #1,(a0)
  63.     subq.b    #1,8(a0)    ; ora cambiamo gli altri wait: la distanza
  64.     subq.b    #1,8*2(a0)    ; tra un wait e l'altro e' di 8 bytes
  65.     subq.b    #1,8*3(a0)
  66.     subq.b    #1,8*4(a0)
  67.     subq.b    #1,8*5(a0)
  68.     subq.b    #1,8*6(a0)
  69.     subq.b    #1,8*7(a0)    ; qua dobbiamo modificare tutti i 9 wait della
  70.     subq.b    #1,8*8(a0)    ; barra rossa ogni volta per farla salire!
  71.     subq.b    #1,8*9(a0)
  72.     rts
  73.  
  74. MettiGiu:
  75.     clr.b    SuGiu        ; Azzerando SuGiu, al TST.B SuGiu il BEQ
  76.     rts            ; fara' saltare alla routine VAIGIU, e
  77.                 ; la barra scedera'
  78.  
  79. VAIGIU:
  80.     cmpi.b    #$2c,8*9(a0)    ; siamo arrivati alla linea $2c?
  81.     beq.s    MettiSu        ; se si, siamo in fondo e dobbiamo risalire
  82.     addq.b    #1,(a0)
  83.     addq.b    #1,8(a0)    ; ora cambiamo gli altri wait: la distanza
  84.     addq.b    #1,8*2(a0)    ; tra un wait e l'altro e' di 8 bytes
  85.     addq.b    #1,8*3(a0)
  86.     addq.b    #1,8*4(a0)
  87.     addq.b    #1,8*5(a0)
  88.     addq.b    #1,8*6(a0)
  89.     addq.b    #1,8*7(a0)    ; qua dobbiamo modificare tutti i 9 wait della
  90.     addq.b    #1,8*8(a0)    ; barra rossa ogni volta per farla scendere!
  91.     addq.b    #1,8*9(a0)
  92.     rts
  93.  
  94. MettiSu:
  95.     move.b    #$ff,SuGiu    ; Quando la label SuGiu non e' a zero,
  96.     rts            ; significa che dobbiamo risalire.
  97.  
  98. ;    Questo byte, indicato dalla label SuGiu, e' un FLAG, ossia una
  99. ;    bandierina (in gergo), infatti una volta e'a  $ff e un'altra e' a
  100. ;    $00, a seconda della direzione da seguire (su o giu'!). E' appunto
  101. ;    come una bandierina, che quando e' abbassata ($00) indica che dobbiamo
  102. ;    scendere e quando e' alzata ($FF) dobbiamo salire. Viene infatti
  103. ;    eseguita una comparazione della linea raggiunta per verificare se
  104. ;    siamo arrivati in cima o in fondo, e se ci siamo arrivati cambiamo
  105. ;    la direzione (con clr.b SuGiu o move.b #$ff,Sugiu)
  106.  
  107. SuGiu:
  108.     dc.b    0,0
  109.  
  110. GfxName:
  111.     dc.b    "graphics.library",0,0    
  112.  
  113. GfxBase:        ; Qua ci va l'indirizzo di base per gli Offset
  114.     dc.l    0    ; della graphics.library
  115.  
  116. OldCop:            ; Qua ci va l'indirizzo della vecchia COP di sistema
  117.     dc.l    0
  118.  
  119.     SECTION    GRAPHIC,DATA_C
  120.  
  121. COPPERLIST:
  122.     dc.w    $100,$200    ; BPLCON0
  123.     dc.w    $180,$000    ; COLOR0 - Inizio la cop col colore NERO
  124.  
  125.     dc.w    $2c07,$FFFE    ; WAIT - una piccola barretta fissa verde
  126.     dc.w    $180,$010    ; COLOR0
  127.     dc.w    $2d07,$FFFE    ; WAIT
  128.     dc.w    $180,$020    ; COLOR0
  129.     dc.w    $2e07,$FFFE
  130.     dc.w    $180,$030
  131.     dc.w    $2f07,$FFFE
  132.     dc.w    $180,$040
  133.     dc.w    $3007,$FFFE
  134.     dc.w    $180,$030
  135.     dc.w    $3107,$FFFE
  136.     dc.w    $180,$020
  137.     dc.w    $3207,$FFFE
  138.     dc.w    $180,$010
  139.     dc.w    $3307,$FFFE
  140.     dc.w    $180,$000
  141.  
  142.     dc.w    $ffdf,$fffe    ; ATTENZIONE! WAIT ALLA FINE LINEA $FF!
  143.                 ; i wait dopo questo sono sotto la linea
  144.                 ; $FF e ripartono da $00!!
  145.  
  146.     dc.w    $0107,$FFFE    ; una barretta fissa verde SOTTO la linea $FF!
  147.     dc.w    $180,$010
  148.     dc.w    $0207,$FFFE
  149.     dc.w    $180,$020
  150.     dc.w    $0307,$FFFE
  151.     dc.w    $180,$030
  152.     dc.w    $0407,$FFFE
  153.     dc.w    $180,$040
  154.     dc.w    $0507,$FFFE
  155.     dc.w    $180,$030
  156.     dc.w    $0607,$FFFE
  157.     dc.w    $180,$020
  158.     dc.w    $0707,$FFFE
  159.     dc.w    $180,$010
  160.     dc.w    $0807,$FFFE
  161.     dc.w    $180,$000
  162.  
  163. BARRA:
  164.     dc.w    $0907,$FFFE    ; aspetto la linea $79
  165.     dc.w    $180,$300    ; inizio la barra rossa: rosso a 3
  166.     dc.w    $0a07,$FFFE    ; linea seguente
  167.     dc.w    $180,$600    ; rosso a 6
  168.     dc.w    $0b07,$FFFE
  169.     dc.w    $180,$900    ; rosso a 9
  170.     dc.w    $0c07,$FFFE
  171.     dc.w    $180,$c00    ; rosso a 12
  172.     dc.w    $0d07,$FFFE
  173.     dc.w    $180,$f00    ; rosso a 15 (al massimo)
  174.     dc.w    $0e07,$FFFE
  175.     dc.w    $180,$c00    ; rosso a 12
  176.     dc.w    $0f07,$FFFE
  177.     dc.w    $180,$900    ; rosso a 9
  178.     dc.w    $1007,$FFFE
  179.     dc.w    $180,$600    ; rosso a 6
  180.     dc.w    $1107,$FFFE
  181.     dc.w    $180,$300    ; rosso a 3
  182.     dc.w    $1207,$FFFE
  183.     dc.w    $180,$000    ; colore NERO
  184.  
  185.     dc.w    $FFFF,$FFFE    ; FINE DELLA COPPERLIST
  186.  
  187.  
  188.     end
  189.  
  190. MIRACOLO! Abbiamo messo delle barre colorate sotto la flamigerata linea $FF!
  191. E basta solo mettere il comando:
  192.  
  193.     dc.w    $ffdf,$fffe
  194.  
  195. E ripartire da $0107,$fffe per waitare nella parte bassa dello screen.
  196. Questo perche' come sapete un byte contiene solo 255 valori, ossia fino
  197. a $FF, dunque per aspettare una linea superiore a $ff basta arrivarci
  198. con $FFdf,$FFFE, poi la numerazione riparte da 0, fino a dove arriva lo
  199. schermo visibile, verso il $30. da notare che lo standard televisivo americano
  200. NTSC arriva fino alla linea $FF solamente, o poco piu' in overscan, quindi
  201. gli americani non vedono la parte bassa dello schermo sul televisore, ma a
  202. noi non importa, perche' l'Amiga e' diffuso soprattutto in Europa dove c'e'
  203. lo standard PAL, infatti le demo e i giochi sono quasi sempre in PAL. In certi
  204. casi i programmatori fanno delle versioni NTSC del gioco esclusivamente per
  205. la distribuzione in USA.
  206.  
  207. NOTA: Per ora abbiamo potuto aspettare con il $DFF006 solo una linea compresa
  208. da $01 a $FF; spieghero' in seguito come si fa ad aspettare col $dffxxx una
  209. linea dopo il $FF correttamente.
  210.  
  211.